
 <!DOCTYPE HTML>
<html >
<head>
  <meta charset="UTF-8">
  
    <title>吴朝捷_熟悉文件处理模块 | B3434lockchain</title>
    <meta name="viewport" content="width=device-width, initial-scale=1,user-scalable=no">
    
    <meta name="author" content="b3434lockchain">
    

    
    <meta name="description" content="实验目的 了解文件处理模块的功能，及其实现 学习对称加密算法、 Merkle 树、CP-ABE/DCP-ABE加密算法  实验原理1.任务描述 ①文件处理模块：包括文件的加解密，文件的碎片化（即文件分割），文件完整性检验。 ②DCP-ABE是一种基于属性加密算法。开始我们可以直接先用 ③对称加密算法 来实现加密，关于文件完整性校验我们可以用 merkle树来实现。 ④大概流程：  当选择一个文件的">
<meta name="keywords" content="报告,吴朝捷">
<meta property="og:type" content="article">
<meta property="og:title" content="吴朝捷_熟悉文件处理模块">
<meta property="og:url" content="http://b3434lockchain.gitee.io/2019/05/28/wuchaojie/wuchaojie1/index.html">
<meta property="og:site_name" content="B3434lockchain">
<meta property="og:description" content="实验目的 了解文件处理模块的功能，及其实现 学习对称加密算法、 Merkle 树、CP-ABE/DCP-ABE加密算法  实验原理1.任务描述 ①文件处理模块：包括文件的加解密，文件的碎片化（即文件分割），文件完整性检验。 ②DCP-ABE是一种基于属性加密算法。开始我们可以直接先用 ③对称加密算法 来实现加密，关于文件完整性校验我们可以用 merkle树来实现。 ④大概流程：  当选择一个文件的">
<meta property="og:locale" content="default">
<meta property="og:image" content="https://i.imgur.com/5TRD2vM.png">
<meta property="og:image" content="https://i.imgur.com/QuHIxVA.png">
<meta property="og:updated_time" content="2019-05-28T14:35:25.528Z">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="吴朝捷_熟悉文件处理模块">
<meta name="twitter:description" content="实验目的 了解文件处理模块的功能，及其实现 学习对称加密算法、 Merkle 树、CP-ABE/DCP-ABE加密算法  实验原理1.任务描述 ①文件处理模块：包括文件的加解密，文件的碎片化（即文件分割），文件完整性检验。 ②DCP-ABE是一种基于属性加密算法。开始我们可以直接先用 ③对称加密算法 来实现加密，关于文件完整性校验我们可以用 merkle树来实现。 ④大概流程：  当选择一个文件的">
<meta name="twitter:image" content="https://i.imgur.com/5TRD2vM.png">

    
    <link rel="alternative" href="/atom.xml" title="B3434lockchain" type="application/atom+xml">
    
    
    <link rel="icon" href="/img/favicon.ico">
    
    
    <link rel="apple-touch-icon" href="/img/jacman.jpg">
    <link rel="apple-touch-icon-precomposed" href="/img/jacman.jpg">
    
    <link rel="stylesheet" href="/css/style.css">
</head>

  <body>
    <header>
      
<div>
		
			<div id="imglogo">
				<a href="/"><img src="/img/logo.png" alt="B3434lockchain" title="B3434lockchain"/></a>
			</div>
			
			<div id="textlogo">
				<h1 class="site-name"><a href="/" title="B3434lockchain">B3434lockchain</a></h1>
				<h2 class="blog-motto"></h2>
			</div>
			<div class="navbar"><a class="navbutton navmobile" href="#" title="Menu">
			</a></div>
			<nav class="animated">
				<ul>
					<ul>
					 
						<li><a href="/">Home</a></li>
					
						<li><a href="/archives">Archives</a></li>
					
						<li><a href="/about">About</a></li>
					
					<li>
 					
						<form class="search" action="https://www.baidu.com" target="_blank">
							<label>Search</label>
						<input name="s" type="hidden" value=  ><input type="text" name="q" size="30" placeholder="Search"><br>
						</form>
					
					</li>
				</ul>
			</nav>			
</div>
    </header>
    <div id="container">
      <div id="main" class="post" itemscope itemprop="blogPost">
  
	<article itemprop="articleBody"> 
		<header class="article-info clearfix">
  <h1 itemprop="name">
    
      <a href="/2019/05/28/wuchaojie/wuchaojie1/" title="吴朝捷_熟悉文件处理模块" itemprop="url">吴朝捷_熟悉文件处理模块</a>
  </h1>
  <p class="article-author">By
       
		<a href="/about" title="b3434lockchain" target="_blank" itemprop="author">b3434lockchain</a>
		
  <p class="article-time">
    <time datetime="2019-05-28T03:00:00.000Z" itemprop="datePublished"> Published 2019-05-28</time>
    
  </p>
</header>
	<div class="article-content">
		
		<div id="toc" class="toc-article">
			<strong class="toc-title">Contents</strong>
		
			<ol class="toc"><li class="toc-item toc-level-5"><a class="toc-link" href="#实验目的"><span class="toc-number">1.</span> <span class="toc-text">实验目的</span></a></li><li class="toc-item toc-level-5"><a class="toc-link" href="#实验原理"><span class="toc-number">2.</span> <span class="toc-text">实验原理</span></a></li><li class="toc-item toc-level-5"><a class="toc-link" href="#实验内容"><span class="toc-number">3.</span> <span class="toc-text">实验内容</span></a></li><li class="toc-item toc-level-5"><a class="toc-link" href="#总结"><span class="toc-number">4.</span> <span class="toc-text">总结</span></a></li><li class="toc-item toc-level-5"><a class="toc-link" href="#附录"><span class="toc-number">5.</span> <span class="toc-text">附录</span></a></li></ol>
		
		</div>
		
		<h5 id="实验目的"><a href="#实验目的" class="headerlink" title="实验目的"></a>实验目的</h5><ol>
<li>了解文件处理模块的功能，及其实现</li>
<li>学习对称加密算法、 Merkle 树、CP-ABE/DCP-ABE加密算法</li>
</ol>
<h5 id="实验原理"><a href="#实验原理" class="headerlink" title="实验原理"></a>实验原理</h5><p>1.任务描述<br><img src="https://i.imgur.com/5TRD2vM.png" alt=""></p>
<p>①文件处理模块：包括文件的加解密，文件的碎片化（即文件分割），文件完整性检验。</p>
<p>②DCP-ABE是一种基于属性加密算法。开始我们可以直接先用</p>
<p>③对称加密算法 来实现加密，关于文件完整性校验我们可以用 merkle树来实现。</p>
<p>④大概流程：</p>
<ul>
<li><p>当选择一个文件的时候，需要对该文件进行加密（对称加密算法、DCP-ABE）</p>
</li>
<li><p>对密文进行分割成碎片，并利用merkle树结构来记录对应信息以便后续检验。</p>
</li>
<li><p>当一个碎片被篡改之后，可以利用记录下来的merkle树的信息检测出来</p>
</li>
</ul>
<p>2.对称加密算法</p>
<p>①基本概念</p>
<p>数据发信方将明文和加密密钥一起经过特殊加密算法处理后，使其变成复杂的加密密文发送出去。收信方收到密文后，若想解读原文，则需要使用加密用过的密钥及相同算法的逆算法对密文进行解密，才能使其恢复成可读明文。其中，使用的密钥只有一个，发收信双方都使用这个密钥对数据进行加密和解密，这就要求解密方事先必须知道加密密钥。</p>
<p>对称加密算法还有许多种分组模式，有EBC、CBC、CFB、OFB、CTR。 此外，对称加密算法还有多种填充方式，有NoPadding（不填充）、Zeros填充、PKCS5Padding填充。</p>
<p>②优缺点</p>
<ul>
<li><p>算法公开、计算量小、加密速度快、加密效率高。</p>
</li>
<li><p>交易双方都使用同样钥匙，安全性得不到保证。</p>
</li>
<li><p>每对用户每次使用对称加密算法时，都需要使用其他人不知道的惟一钥匙，这会使得发收信双方所拥有的钥匙数量呈几何级数增长，密钥管理比较困难，这主要影响了其在分布式网络系统上的应用。</p>
</li>
</ul>
<p>③DES算法</p>
<p>基于“对称密钥”的加密算法主要有DES、TripleDES、AES、RC2、RC4、RC5和Blowfish等。目前我主要了解的是DES算法。DES算法的入口参数有三个：Key、Data、Mode。其中Key为8个字节共64位，是DES算法的工作密钥；Data也为8个字节64位，是要被加密或被解密的数据；Mode为DES的工作方式,有两种：加密或解密。</p>
<p>DES算法把64位的明文输入块变为64位的密文输出块，它所使用的密钥也是64位，其算法主要分为两步：</p>
<ul>
<li>初始置换</li>
</ul>
<p>其功能是把输入的64位数据块按位重新组合,并把输出分为L0、R0两部分，每部分各长32位，其置换规则为将输入的第58位换到第一位，第50位换到第2位……依此类推,最后一位是原来的第7位。L0、R0则是换位输出后的两部分，L0是输出的左32位，R0是右32位，例：设置换前的输入值为D1D2D3……D64，则经过初始置换后的结果为:L0=D58D50……D8；R0=D57D49……D7。</p>
<ul>
<li>逆置换</li>
</ul>
<p>经过16次迭代运算后，得到L16、R16,将此作为输入，进行逆置换，逆置换正好是初始置换的逆运算，由此即得到密文输出。</p>
<p>3.Merkle Tree</p>
<p>Merkle Tree是Dynamo中用来同步数据一致性的算法，Merkle Tree是基于数据HASH构建的一个树。它具有以下几个特点：</p>
<p>①数据结构是一个树，可以是二叉树，也可以是多叉树（本BLOG以二叉树来分析）</p>
<p>②Merkle Tree的叶子节点的value是数据集合的单元数据或者单元数据HASH。</p>
<p>③Merke Tree非叶子节点value是其所有子节点value的HASH值。</p>
<p>基于以上特性，检索Merkle Tree中的文件复杂度理论上为log（N）。而在Merkle Tree中删除和添加文件时，依旧得保持以上特性。</p>
<p>4.CP-ABE/DCP-ABE</p>
<p>CP-ABE(ciphertext policy attribute based encryption，密文策略属性基加密系统)：所谓密文政策加密系统是指，密文对应于一个访问结构而密钥对应于属性集合，解密当且仅当属性集合中的属性能够满足此访问结构。这种设计比较接近于现实中的应用场景，可以假象每个用户根据自身条件或者属性从属性机构得到密钥，然后加密者来制定对消息的访问控制。</p>
<p>CP-ABE的原理如下图所示：<br><img src="https://i.imgur.com/QuHIxVA.png" alt=""></p>
<p>DCP-ABE是CP-ABE的改进，前者有多个属性授权机构而后者只有一个，故DCP-ABE有去中心化的特点。师兄给了我两篇关于DCP-ABE的论文（Decentralizing Attribute-Based Encryption、Multi-authority Attribute Based Encryption），我还没看完，相信看完后能对基于属性的加密方法有更清晰的认识。</p>
<h5 id="实验内容"><a href="#实验内容" class="headerlink" title="实验内容"></a>实验内容</h5><p>1.学习相关知识</p>
<p>这部分工作其实就是实验原理中的内容</p>
<p>2.实践操作</p>
<p>我参考了一篇博客中的DES（ECB模式，无填充）的Java代码实现。它的实现是基于许多有关加密的java基本库的，代码的封装性较强。所以目前我只知道它每段代码在做什么，但不知道具体是怎么做到的。代码放在了附录。然后自己在运行代码时，遇到一个问题，导入完jar包后import其中的类报错“无法解析”，现在还在想办法解决。</p>
<p>而至于Merkle 树、CP-ABE/DCP-ABE的具体代码，暂时没有涉及。</p>
<h5 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h5><p>这期的主要工作是学习相关知识，熟悉相关的开发环境和明白任务需求。这期间有不少考试，时间没有安排好，代码实现方面做得有所欠缺，接下来会重点弥补这块。</p>
<h5 id="附录"><a href="#附录" class="headerlink" title="附录"></a>附录</h5><p>DES代码<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">package amigo.endecrypt;</span><br><span class="line"> </span><br><span class="line"> import java.security.InvalidKeyException;</span><br><span class="line"> import java.security.Key;</span><br><span class="line"> import java.security.NoSuchAlgorithmException;</span><br><span class="line"> import java.security.SecureRandom;</span><br><span class="line"> import java.security.spec.InvalidKeySpecException;</span><br><span class="line"> </span><br><span class="line"> import javax.crypto.Cipher;</span><br><span class="line"> import javax.crypto.SecretKey;</span><br><span class="line"> import javax.crypto.SecretKeyFactory;</span><br><span class="line"> import javax.crypto.spec.DESKeySpec;</span><br><span class="line"> </span><br><span class="line"> import org.apache.commons.codec.binary.Base64;</span><br><span class="line"> </span><br><span class="line"> public class DESUtil &#123;</span><br><span class="line">     //算法名称 </span><br><span class="line">     public static final String KEY_ALGORITHM = &quot;DES&quot;;</span><br><span class="line">     //算法名称/加密模式/填充方式 </span><br><span class="line">     //DES共有四种工作模式--&gt;&gt;ECB：电子密码本模式、CBC：加密分组链接模式、CFB：加密反馈模式、OFB：输出反馈模式</span><br><span class="line">     public static final String CIPHER_ALGORITHM = &quot;DES/ECB/NoPadding&quot;;</span><br><span class="line"> </span><br><span class="line">     /**</span><br><span class="line">      *   </span><br><span class="line">      * 生成密钥key对象</span><br><span class="line">      * @param KeyStr 密钥字符串 </span><br><span class="line">      * @return 密钥对象 </span><br><span class="line">      * @throws InvalidKeyException   </span><br><span class="line">      * @throws NoSuchAlgorithmException   </span><br><span class="line">      * @throws InvalidKeySpecException   </span><br><span class="line">      * @throws Exception </span><br><span class="line">      */</span><br><span class="line">     private static SecretKey keyGenerator(String keyStr) throws Exception &#123;</span><br><span class="line">         byte input[] = HexString2Bytes(keyStr);</span><br><span class="line">         DESKeySpec desKey = new DESKeySpec(input);</span><br><span class="line">         //创建一个密匙工厂，然后用它把DESKeySpec转换成</span><br><span class="line">         SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(&quot;DES&quot;);</span><br><span class="line">         SecretKey securekey = keyFactory.generateSecret(desKey);</span><br><span class="line">         return securekey;</span><br><span class="line">     &#125;</span><br><span class="line"> </span><br><span class="line">     private static int parse(char c) &#123;</span><br><span class="line">         if (c &gt;= &apos;a&apos;) return (c - &apos;a&apos; + 10) &amp; 0x0f;</span><br><span class="line">         if (c &gt;= &apos;A&apos;) return (c - &apos;A&apos; + 10) &amp; 0x0f;</span><br><span class="line">         return (c - &apos;0&apos;) &amp; 0x0f;</span><br><span class="line">     &#125;</span><br><span class="line"> </span><br><span class="line">     // 从十六进制字符串到字节数组转换 </span><br><span class="line">     public static byte[] HexString2Bytes(String hexstr) &#123;</span><br><span class="line">         byte[] b = new byte[hexstr.length() / 2];</span><br><span class="line">         int j = 0;</span><br><span class="line">         for (int i = 0; i &lt; b.length; i++) &#123;</span><br><span class="line">             char c0 = hexstr.charAt(j++);</span><br><span class="line">             char c1 = hexstr.charAt(j++);</span><br><span class="line">             b[i] = (byte) ((parse(c0) &lt;&lt; 4) | parse(c1));</span><br><span class="line">         &#125;</span><br><span class="line">         return b;</span><br><span class="line">     &#125;</span><br><span class="line"> </span><br><span class="line">     /** </span><br><span class="line">      * 加密数据</span><br><span class="line">      * @param data 待加密数据</span><br><span class="line">      * @param key 密钥</span><br><span class="line">      * @return 加密后的数据 </span><br><span class="line">      */</span><br><span class="line">     public static String encrypt(String data, String key) throws Exception &#123;</span><br><span class="line">         Key deskey = keyGenerator(key);</span><br><span class="line">         // 实例化Cipher对象，它用于完成实际的加密操作</span><br><span class="line">         Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);</span><br><span class="line">         SecureRandom random = new SecureRandom();</span><br><span class="line">         // 初始化Cipher对象，设置为加密模式</span><br><span class="line">         cipher.init(Cipher.ENCRYPT_MODE, deskey, random);</span><br><span class="line">         byte[] results </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p>
  
	</div>
		<footer class="article-footer clearfix">
<div class="article-catetags">


  <div class="article-tags">
  
  <span></span> <a href="/tags/报告/">报告</a><a href="/tags/吴朝捷/">吴朝捷</a>
  </div>

</div>



	<div class="article-share" id="share">
	
	  <div data-url="http://b3434lockchain.gitee.io/2019/05/28/wuchaojie/wuchaojie1/" data-title="吴朝捷_熟悉文件处理模块 | B3434lockchain" data-tsina="" class="share clearfix">
	  </div>
	
	</div>


</footer>

   	       
	</article>
	
<nav class="article-nav clearfix">
 
 <div class="prev" >
 <a href="/2019/06/03/jiaxin/restore-week5/" title="Restore基本完整界面">
  <strong>上一篇：</strong><br/>
  <span>
  Restore基本完整界面</span>
</a>
</div>


<div class="next">
<a href="/2019/05/13/tanjunxi/tanjunxi10/"  title="谭俊熙_Restore客户端编写">
 <strong>下一篇：</strong><br/> 
 <span>谭俊熙_Restore客户端编写
</span>
</a>
</div>

</nav>

	



</div>  
      <div class="openaside"><a class="navbutton" href="#" title="Show Sidebar"></a></div>

  <div id="toc" class="toc-aside">
  <strong class="toc-title">Contents</strong>
 
 <ol class="toc"><li class="toc-item toc-level-5"><a class="toc-link" href="#实验目的"><span class="toc-number">1.</span> <span class="toc-text">实验目的</span></a></li><li class="toc-item toc-level-5"><a class="toc-link" href="#实验原理"><span class="toc-number">2.</span> <span class="toc-text">实验原理</span></a></li><li class="toc-item toc-level-5"><a class="toc-link" href="#实验内容"><span class="toc-number">3.</span> <span class="toc-text">实验内容</span></a></li><li class="toc-item toc-level-5"><a class="toc-link" href="#总结"><span class="toc-number">4.</span> <span class="toc-text">总结</span></a></li><li class="toc-item toc-level-5"><a class="toc-link" href="#附录"><span class="toc-number">5.</span> <span class="toc-text">附录</span></a></li></ol>
 
  </div>

<div id="asidepart">
<div class="closeaside"><a class="closebutton" href="#" title="Hide Sidebar"></a></div>
<aside class="clearfix">

  

  
<div class="tagslist">
	<p class="asidetitle">Tags</p>
		<ul class="clearfix">
		
			
				<li><a href="/tags/周报/" title="周报">周报<sup>23</sup></a></li>
			
		
			
				<li><a href="/tags/谭俊熙/" title="谭俊熙">谭俊熙<sup>11</sup></a></li>
			
		
			
				<li><a href="/tags/苏思捷/" title="苏思捷">苏思捷<sup>5</sup></a></li>
			
		
			
				<li><a href="/tags/学习报告/" title="学习报告">学习报告<sup>5</sup></a></li>
			
		
			
				<li><a href="/tags/卢家豪/" title="卢家豪">卢家豪<sup>5</sup></a></li>
			
		
			
				<li><a href="/tags/报告/" title="报告">报告<sup>5</sup></a></li>
			
		
			
				<li><a href="/tags/苏佳鑫/" title="苏佳鑫">苏佳鑫<sup>4</sup></a></li>
			
		
			
				<li><a href="/tags/冯华文/" title="冯华文">冯华文<sup>4</sup></a></li>
			
		
			
				<li><a href="/tags/周报反馈/" title="周报反馈">周报反馈<sup>2</sup></a></li>
			
		
			
				<li><a href="/tags/吴朝捷/" title="吴朝捷">吴朝捷<sup>2</sup></a></li>
			
		
			
				<li><a href="/tags/黎宁/" title="黎宁">黎宁<sup>1</sup></a></li>
			
		
			
				<li><a href="/tags/笔记/" title="笔记">笔记<sup>1</sup></a></li>
			
		
		</ul>
</div>


</aside>
</div>
    </div>
    <footer><div id="footer" >
	
	
	<div class="social-font" class="clearfix">
		
		
		
		
		
		
		
		
		
		
	</div>
			
		

		<p class="copyright">
		
		</p>
</div>
</footer>
    <script src="/js/jquery-2.0.3.min.js"></script>
<script src="/js/jquery.imagesloaded.min.js"></script>
<script src="/js/gallery.js"></script>
<script src="/js/jquery.qrcode-0.12.0.min.js"></script>

<script type="text/javascript">
$(document).ready(function(){ 
  $('.navbar').click(function(){
    $('header nav').toggleClass('shownav');
  });
  var myWidth = 0;
  function getSize(){
    if( typeof( window.innerWidth ) == 'number' ) {
      myWidth = window.innerWidth;
    } else if( document.documentElement && document.documentElement.clientWidth) {
      myWidth = document.documentElement.clientWidth;
    };
  };
  var m = $('#main'),
      a = $('#asidepart'),
      c = $('.closeaside'),
      o = $('.openaside');
  c.click(function(){
    a.addClass('fadeOut').css('display', 'none');
    o.css('display', 'block').addClass('fadeIn');
    m.addClass('moveMain');
  });
  o.click(function(){
    o.css('display', 'none').removeClass('beforeFadeIn');
    a.css('display', 'block').removeClass('fadeOut').addClass('fadeIn');      
    m.removeClass('moveMain');
  });
  $(window).scroll(function(){
    o.css("top",Math.max(80,260-$(this).scrollTop()));
  });
  
  $(window).resize(function(){
    getSize(); 
    if (myWidth >= 1024) {
      $('header nav').removeClass('shownav');
    }else{
      m.removeClass('moveMain');
      a.css('display', 'block').removeClass('fadeOut');
      o.css('display', 'none');
      
      $('#toc.toc-aside').css('display', 'none');
        
    }
  });
});
</script>

<script type="text/javascript">
$(document).ready(function(){ 
  var ai = $('.article-content>iframe'),
      ae = $('.article-content>embed'),
      t  = $('#toc'),
      ta = $('#toc.toc-aside'),
      o  = $('.openaside'),
      c  = $('.closeaside');
  if(ai.length>0){
    ai.wrap('<div class="video-container" />');
  };
  if(ae.length>0){
   ae.wrap('<div class="video-container" />');
  };
  c.click(function(){
    ta.css('display', 'block').addClass('fadeIn');
  });
  o.click(function(){
    ta.css('display', 'none');
  });
  $(window).scroll(function(){
    ta.css("top",Math.max(140,320-$(this).scrollTop()));
  });
});
</script>


<script type="text/javascript">
$(document).ready(function(){ 
  var $this = $('.share'),
      url = $this.attr('data-url'),
      encodedUrl = encodeURIComponent(url),
      title = $this.attr('data-title'),
      tsina = $this.attr('data-tsina'),
      description = $this.attr('description');
  var html = [
  '<div class="hoverqrcode clearfix"></div>',
  '<a class="overlay" id="qrcode"></a>',
  '<a href="https://www.facebook.com/sharer.php?u=' + encodedUrl + '" class="article-share-facebook" target="_blank" title="Facebook"></a>',
  '<a href="https://twitter.com/intent/tweet?url=' + encodedUrl + '" class="article-share-twitter" target="_blank" title="Twitter"></a>',
  '<a href="#qrcode" class="article-share-qrcode" title="微信"></a>',
  '<a href="http://widget.renren.com/dialog/share?resourceUrl=' + encodedUrl + '&srcUrl=' + encodedUrl + '&title=' + title +'" class="article-share-renren" target="_blank" title="人人"></a>',
  '<a href="http://service.weibo.com/share/share.php?title='+title+'&url='+encodedUrl +'&ralateUid='+ tsina +'&searchPic=true&style=number' +'" class="article-share-weibo" target="_blank" title="微博"></a>',
  '<span title="Share to"></span>'
  ].join('');
  $this.append(html);

  $('.hoverqrcode').hide();

  var myWidth = 0;
  function updatehoverqrcode(){
    if( typeof( window.innerWidth ) == 'number' ) {
      myWidth = window.innerWidth;
    } else if( document.documentElement && document.documentElement.clientWidth) {
      myWidth = document.documentElement.clientWidth;
    };
    var qrsize = myWidth > 1024 ? 200:100;
    var options = {render: 'image', size: qrsize, fill: '#2ca6cb', text: url, radius: 0.5, quiet: 1};
    var p = $('.article-share-qrcode').position();
    $('.hoverqrcode').empty().css('width', qrsize).css('height', qrsize)
                          .css('left', p.left-qrsize/2+20).css('top', p.top-qrsize-10)
                          .qrcode(options);
  };
  $(window).resize(function(){
    $('.hoverqrcode').hide();
  });
  $('.article-share-qrcode').click(function(){
    updatehoverqrcode();
    $('.hoverqrcode').toggle();
  });
  $('.article-share-qrcode').hover(function(){}, function(){
      $('.hoverqrcode').hide();
  });
});   
</script>











<link rel="stylesheet" href="/fancybox/jquery.fancybox.css" media="screen" type="text/css">
<script src="/fancybox/jquery.fancybox.pack.js"></script>
<script type="text/javascript">
$(document).ready(function(){ 
  $('.article-content').each(function(i){
    $(this).find('img').each(function(){
      if ($(this).parent().hasClass('fancybox')) return;
      var alt = this.alt;
      if (alt) $(this).after('<span class="caption">' + alt + '</span>');
      $(this).wrap('<a href="' + this.src + '" title="' + alt + '" class="fancybox"></a>');
    });
    $(this).find('.fancybox').each(function(){
      $(this).attr('rel', 'article' + i);
    });
  });
  if($.fancybox){
    $('.fancybox').fancybox();
  }
}); 
</script>



<!-- Analytics Begin -->





<!-- Analytics End -->

<!-- Totop Begin -->

	<div id="totop">
	<a title="Back to Top"><img src="/img/scrollup.png"/></a>
	</div>
	<script src="/js/totop.js"></script>

<!-- Totop End -->

<!-- MathJax Begin -->
<!-- mathjax config similar to math.stackexchange -->


<!-- MathJax End -->

<!-- Tiny_search Begin -->

<!-- Tiny_search End -->

  </body>
</html>
